package atguigu.limit;

/**
 * 限流算法.txt：漏桶限流算法
 * <p>
 * 漏桶算法可以粗略的认为就是注水漏水过程，往桶中以一定速率流出水，以任意速率流入水，当水超过桶流量则丢弃，因为桶容量是不变的，保证了整体的速率。
 * 本质就是一个队列，入队时候是可以不限速度的，但是会判断总容量，出队时候，是限制速度得， 动态的保证整体得队列容量平衡。
 */
public class BucketAlgorithm {
    private double rate;//水流速率
    private double capacity;//桶大小
    private double refreshTime = System.currentTimeMillis(); //刷新时间
    private double wator;//当前水量（当前累计请求数）

    public static void main(String[] args) {

        BucketAlgorithm bucketAlgorithm = new BucketAlgorithm();
        bucketAlgorithm.grant();
    }


    public boolean grant() {
        double now = System.currentTimeMillis();
        wator = Math.max(0, wator - (now - refreshTime) * rate);
        refreshTime = now;
        if ((wator + 1) < capacity) {
            wator += 1;
            return true;
        } else {
            //水满了  拒绝加水
            return false;
        }
    }
}
